/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2023-07-12     18421       the first version
 */
#ifndef APPLICATIONS_SWITCH_SWITCH_H_
#define APPLICATIONS_SWITCH_SWITCH_H_
#include "rtthread.h"
#include "main.h"

#define KEY_NUM_ALL 8  /*按键数量*/


#define SW1_ON    HAL_GPIO_WritePin(SW1_GPIO_Port, SW1_Pin,GPIO_PIN_SET)
#define SW1_OFF    HAL_GPIO_WritePin(SW1_GPIO_Port, SW1_Pin,GPIO_PIN_RESET)
#define SW2_ON    HAL_GPIO_WritePin(SW2_GPIO_Port, SW2_Pin,GPIO_PIN_SET)
#define SW2_OFF    HAL_GPIO_WritePin(SW2_GPIO_Port, SW2_Pin,GPIO_PIN_RESET)
#define SW3_ON    HAL_GPIO_WritePin(SW3_GPIO_Port, SW3_Pin,GPIO_PIN_SET)
#define SW3_OFF    HAL_GPIO_WritePin(SW3_GPIO_Port, SW3_Pin,GPIO_PIN_RESET)
#define SW4_ON    HAL_GPIO_WritePin(SW4_GPIO_Port, SW4_Pin,GPIO_PIN_SET)
#define SW4_OFF    HAL_GPIO_WritePin(SW4_GPIO_Port, SW4_Pin,GPIO_PIN_RESET)
#define SW5_ON    HAL_GPIO_WritePin(SW5_GPIO_Port, SW5_Pin,GPIO_PIN_SET)
#define SW5_OFF    HAL_GPIO_WritePin(SW5_GPIO_Port, SW5_Pin,GPIO_PIN_RESET)
#define SW6_ON    HAL_GPIO_WritePin(SW6_GPIO_Port, SW6_Pin,GPIO_PIN_SET)
#define SW6_OFF    HAL_GPIO_WritePin(SW6_GPIO_Port, SW6_Pin,GPIO_PIN_RESET)
#define SW7_ON    HAL_GPIO_WritePin(SW7_GPIO_Port, SW7_Pin,GPIO_PIN_SET)
#define SW7_OFF    HAL_GPIO_WritePin(SW7_GPIO_Port, SW7_Pin,GPIO_PIN_RESET)
#define SW8_ON    HAL_GPIO_WritePin(SW8_GPIO_Port, SW8_Pin,GPIO_PIN_SET)
#define SW8_OFF    HAL_GPIO_WritePin(SW8_GPIO_Port, SW8_Pin,GPIO_PIN_RESET)



#define key1_read()     HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)
#define key2_read()     HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)
#define key3_read()     HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)
#define key4_read()     HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin)
#define key5_read()     HAL_GPIO_ReadPin(KEY5_GPIO_Port,KEY5_Pin)
#define key6_read()     HAL_GPIO_ReadPin(KEY6_GPIO_Port,KEY6_Pin)
#define key7_read()     HAL_GPIO_ReadPin(KEY7_GPIO_Port,KEY7_Pin)
#define key8_read()     HAL_GPIO_ReadPin(KEY8_GPIO_Port,KEY8_Pin)

#define SW1A_read()     HAL_GPIO_ReadPin(SW1_INA_GPIO_Port,SW1_INA_Pin)
#define SW1B_read()     HAL_GPIO_ReadPin(SW1_INB_GPIO_Port,SW1_INB_Pin)
#define SW2A_read()     HAL_GPIO_ReadPin(SW2_INA_GPIO_Port,SW2_INA_Pin)
#define SW2B_read()     HAL_GPIO_ReadPin(SW2_INB_GPIO_Port,SW2_INB_Pin)
#define SW3A_read()     HAL_GPIO_ReadPin(SW3_INA_GPIO_Port,SW3_INA_Pin)
#define SW3B_read()     HAL_GPIO_ReadPin(SW3_INB_GPIO_Port,SW3_INB_Pin)
#define SW4A_read()     HAL_GPIO_ReadPin(SW4_INA_GPIO_Port,SW4_INA_Pin)
#define SW4B_read()     HAL_GPIO_ReadPin(SW4_INB_GPIO_Port,SW4_INB_Pin)
#define SW5A_read()     HAL_GPIO_ReadPin(SW5_INA_GPIO_Port,SW5_INA_Pin)
#define SW5B_read()     HAL_GPIO_ReadPin(SW5_INB_GPIO_Port,SW5_INB_Pin)

#define SW6A_read()     HAL_GPIO_ReadPin(SW6_INA_GPIO_Port,SW6_INA_Pin)
#define SW6B_read()     HAL_GPIO_ReadPin(SW6_INB_GPIO_Port,SW6_INB_Pin)

#define SW7A_read()     HAL_GPIO_ReadPin(SW7_INA_GPIO_Port,SW7_INA_Pin)
#define SW7B_read()     HAL_GPIO_ReadPin(SW7_INB_GPIO_Port,SW7_INB_Pin)

#define SW8A_read()     HAL_GPIO_ReadPin(SW8_INA_GPIO_Port,SW8_INA_Pin)
#define SW8B_read()     HAL_GPIO_ReadPin(SW8_INB_GPIO_Port,SW8_INB_Pin)

/*三档拨码开关SWX检测AB接口*/
enum SwPort{
    PORTA,
    PORTB
};

typedef enum {
    FORCEOFF,        //强制关
    FORCEON,         //强制开

    CONTROL,        //可控制
    STATUSERR
}SwStatus;
/* 和硬件相关 */
#define KEY_HARDWARE_UP         1
#define LED_HARDWARE_DOWN       0

/* 按键状态 */
typedef enum{
    KEYDOWN,
    KEYUP,
    KEYERROR
}KeyStatus;



/* 按键处理 */
struct KeyInfo{
    uint32_t filterCount[KEY_NUM_ALL];    //消抖
    uint8_t  stepFlag[KEY_NUM_ALL];
    uint8_t  currentStatus[KEY_NUM_ALL];  //按键状态
    uint8_t Control_Enable[KEY_NUM_ALL];  //key允许控制标志位，只有关闭强开强关的时候按键允许触发 1允许
};


struct swInfo{
    uint8_t swstatus[KEY_NUM_ALL];       //SW状态  0强制关 1强制开 2可控制
    uint8_t stepFlag[KEY_NUM_ALL];
    uint32_t filterCount[KEY_NUM_ALL];    //消抖

};

enum MenuKeyIs{
    KEY1DOWN,
    KEY2DOWN,
    KEY3DOWN,
    KEY4DOWN,
    KEY5DOWN,
    KEY6DOWN,
    KEY7DOWN,
    KEY8DOWN
};

struct cmdCtrl{
    uint8_t swNum;
    uint8_t SwStatus;
};

void ScanKeyStatus(void);
void KeyDriverInit(void);
enum MenuKeyIs GetMenuKeyState(void);
void SetMenuKeyIsNoKey(void);
uint8_t scanPowerStatus();

//
uint32_t GetTimer1Tick(void);
uint32_t GetTimer1IntervalTick(uint32_t beginTick);
void netCmdCtrl(int swNum, int status,const char* id);
void swWrite(uint8_t keyNum, uint8_t state);
void swTimeUp();


#endif /* APPLICATIONS_SWITCH_SWITCH_H_ */
